package com.wangzhenyu.learn.test.designPattern


//单一职责原则
//对类来说，即一个类应该只负责一项职责，如果类A负责两个不同职责：职责1，职责2.当职责1需求变更而改变A时，可能造成职责2执行错误，所以需要将类A的粒度分解为A1,A2.

//接口隔离原则
//客户端不应该依赖它不需要的接口，即一个类对另一个类的依赖应该建立在最小的接口上。
//类A通过接口Interface依赖类B，类C通过接口Interface依赖类D，如果接口Interface对于类A和类C来说不是最小接口，那么类B和类D必须去实现他们不需要的方法
//将接口Interface拆分为独立的几个接口，类A和类C分别与他们需要的接口建立依赖关系。就是采用接口隔离原则

//依赖倒转（倒置）原则
//①高层模块不应该依赖低层模块，二者都应该依赖其抽象
//②抽象不应该依赖细节，细节应该依赖抽象
//③依赖倒转的中心思想是面向接口编程
//④依赖倒装原则是基于这样的设计理念：相对于细节的多变性，抽象的东西要稳定的多。
//  以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定的多。在Java中，抽象指的是接口或抽象类，细节就是具体的实现类
//⑤使用接口或抽象类的目的是制定好规范，而不涉及任何具体的操作，把展现细节的任务交给他们的实现类去完成

//里氏替换原则
//①如果对每个类型为T1的对像o1，都有类型为T2的对象o2，使得以T1定义的所有程序P所有的对象o1都代换成o2时，程序P的行为没有发生变化，那么类型T2是类型T1的子类型。
//  换句话说，所有引用基类的地方必须能透明地使用其子类的对象。
//②在使用继承时，遵循里氏替换原则，在子类中尽量不要重写父类的方法。
//③里氏替换原则告诉我们，继承实际上让两个类耦合性增强了，在适当的情况下，可以通过聚合，组合，依赖来解决问题。

//开闭原则
//①一个软件实体如类，模块和函数应该对扩展开放，对修改关闭。用抽象构建框架，用实现扩展细节。
//②当代码需要变化时，尽量通过扩展软件实体的行为来实现变化，而不是通过修改已有的代码来实现变化

//迪米特原则
//①一个对象应该对其他对象保持最少的了解
//②类与类关系越密切，耦合度越大
//③迪米特法则又叫最少知道原则，即一个类对自己依赖的类知道的越少越好。也就是说，对于被依赖的类不管多么复杂，都尽量将逻辑封装在类的内部。对外除了提供的public方法，不对外泄露任何信息
//④简单的定义：只与直接的朋友通信
//⑤直接的朋友：每个对象都会与其他对象有耦合关系，只要两个对象之间有耦合关系，我们就说这两个对象之间是朋友关系。
//耦合的方式有很多，依赖，关联，组合，聚合等。
//其中，我们称出现成员变量，方法参数，方法返回值中的类为直接的朋友，而出现在局部变量中的类不是直接的朋友。也就是说，陌生的类最好不要以局部变量的形式出现在类的内部

//合成复用原则
//原则时尽量使用合成/聚合的方式，而不是使用继承

//UML类图
//依赖(dependence)
//只要类中用到了对方，那么他们之间就存在依赖关系。如果没有对方，连编译都通过不了
//①类中用到了对方②类的成员属性③方法的返回类型④方法接受的参数类型⑤方法中使用到

//泛化（继承）(generalization)
//依赖关系的特例
//①泛化关系实际上就是继承关系②如果A继承了B类，我们就说A和B存在泛化关系

//实现(implementation)
//实现关系实际上就是A类实现B类，他是依赖关系的特例

//关联(association)
//类与类之间的联系，依赖关系的特例
//具有导航性：即双向关系或单向关系
//多重性：即“1”（表示有且仅有一个），"0..."（表示0个或者多个），”0,1“（表示0个或者一个），"n...m"（表示n到m个都可以），"m..."（表示至少m个）

//聚合(aggregation)
//整体和部分的关系，整体与部分可以分开。聚合关系是关联关系的特例，所以他具有关联的导航性与多重性

//组合（composition）
//整体和部分的关系，但是整体和部分不可分开


@Suppress("UNUSED")
object ABaseOfDesignPattern {

    //创建型模式（解决对象的创建问题）
    //（1）单例模式
    //BCreateSingletonClass

    //（2）工厂模式
    //CFactoryPattern

    //（3）抽象工厂模式
    //DAbstractFactory

    //（4）原型模式
    //EPrototypePattern

    //（5）建造者模式
    //FBuilderPattern

    //结构性模式（类或对象的组合或组装）
    //（6）适配器模式
    //GAdapterPattern

    //（7）桥接模式
    //HBridgePattern

    //（8）装饰器模式
    //IDecoratorPattern

    //（9）组合模式
    //JCompositePattern

    //（10）外观模式
    //KFacadePattern

    //（11）享元模式
    //LFlyweightPattern

    //（12）代理模式
    //MProxyPattern

    //行为型模式（类或对象之间的交互）
    //（13）模板模式
    //NTemplatePattern

    //（14）命令模式
    //OCommandPattern

    //（15）访问者模式
    //PVisitorPattern

    //（16）迭代器模式
    //QIteratorPattern

    //（17）观察者模式
    //RObservePattern

    //（18）中介模式
    //SMediatorPattern

    //（19）备忘录模式
    //TMementoPattern

    //（20）解释器模式
    //UInterpreterPattern

    //（21）状态模式
    //VStatePattern

    //（22）策略模式
    //WStrategyPattern

    //（23）职责链模式
    //XChainOfResponsibilityPattern

}